package dao;

import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;

import metier.Produit;

public class ProduitDAO_Oracle implements ProduitDAO {

	private PreparedStatement psCreate;
	private PreparedStatement psRead;
	private PreparedStatement psUpdate;
	private PreparedStatement psDelete;
	private PreparedStatement psFind;
	
	private static String driver = "oracle.jdbc.driver.OracleDriver";
	private static String 	url  = "jdbc:oracle:thin:@dell-oracle:1521:iut";
	private static String 	user = "maniaci";
	private static String 	pass = "maniaci";
	
	private Connection cx;
	
	public ProduitDAO_Oracle () {
		try {
			Class.forName(driver);
			cx = DriverManager.getConnection(url, user, pass);
		} catch (ClassNotFoundException e) {
			System.out.println("Impossible de démarrer le driver : " + e.getMessage());
		} catch (SQLException e) {
			System.out.println("Impossible d'obtenir la connexion.");
			e.printStackTrace();
		}
		
		try {
			psCreate = cx.prepareStatement("INSERT INTO Produits VALUES(seqProduits.NEXTVAL, ?, ?, ?)");
			psRead   = cx.prepareStatement("SELECT * FROM Produits WHERE nom = ?");
			psUpdate = cx.prepareStatement("UPDATE Produits SET prixUnitaireHT = ?, quantiteStock = ? WHERE nom = ?");
			psDelete = cx.prepareStatement("DELETE FROM Produits WHERE nom = ?");
			psFind   = cx.prepareStatement("SELECT * FROM Produits");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/* CRUD */
	public boolean create (Produit p) {
		boolean res = false;
		try {
			psCreate.setString(1, p.getNom());
			psCreate.setFloat (2, p.getPrixUnitaireTTC());
			psCreate.setInt(3, p.getQuantiteStock());
			psCreate.executeUpdate ();
			res = true;
		} catch (SQLException e) {
			System.out.println ("Impossible de définir les valeurs de création pour le Produit.");
			e.printStackTrace();
		}
		return res;
	}
	
	public Produit read (String nom) {
		try {
			psRead.setString(1, nom);
			ResultSet rs = psRead.executeQuery();
			int stock  = rs.getInt("quantitestock");
			float prix = rs.getFloat ("prixunitaireht");
			return new Produit (nom, prix, stock);
		} catch (SQLException e) {
			e.printStackTrace ();
		}
		return null;
	}

	public boolean update (Produit p) {
		boolean res = false;
		try {
			psUpdate.setInt    (2, p.getQuantiteStock());
			psUpdate.setFloat  (1, p.getPrixUnitaireTTC());
			psUpdate.setString (3, p.getNom());
			psUpdate.executeUpdate ();
			res = true;
			/* FIXME: pouvoir changer le nom */
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return res;
	}

	public boolean delete (Produit p) {
		boolean res = false;
		try {
			psDelete.setString(1, p.getNom ());
			psDelete.executeUpdate ();
			res = true;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return res;
	}
	
	public List<Produit> find_all () {
		List<Produit> cam = new ArrayList<Produit> ();
		ResultSet rs;
		try {
			rs = psFind.executeQuery ();
			while (rs.next()) {
				int stock  = rs.getInt("quantitestock");
				float prix = rs.getFloat ("prixunitaireht");
				String nom = rs.getString("nom");
				Produit p = new Produit (nom, prix, stock);
				cam.add(p);
			}
		} catch (SQLException e) {
			System.out.println ("Impossible d'exécuter le chargement des données.");
			e.printStackTrace();
		}
		
		return cam;
	}
}